# Lucid is (C) Copyright 2006-2007 by Infiscape Corporation
#
# This file is part of Lucid, a PyOpenSG example application.
#
# Lucid is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# Lucid is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program.  If not, see <http://www.gnu.org/licenses/>.

# mixins

# Implementation of singleton and borg patterns.
# both of these support derivation.
#
# The difference is that Singleton returns the same instance each time
# so the instances test == to each other.
#
# Borg creates new instances that just share state
#

class Singleton(object):
   """ Note, the init method will be called multiple times. """
   def __new__(ctype):
      if not '_the_instance' in ctype.__dict__:
         ctype._the_instance = object.__new__(ctype)
      return ctype._the_instance

class Borg(object):   
   """ Note, the init method will be called multiple times. """
   def __new__(ctype):
      self = object.__new__(ctype)
      if not '_state' in ctype.__dict__:
         ctype._state = {}
      self.__dict__ = ctype._state
      return self

